package com.sinog.core.util;

import com.sinog.core.utilbean.Constants;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @desc 电话校验工具类
 * @author lzq
 * @date 2020-09-08 2:31 下午
 */
public final class PhoneUtil {

    private static final Pattern P_MOBILE = Pattern.compile("^[1][3,4,5,6,7,8,9][0-9]{9}$");
    /**
     * 验证带区号的
     */
    private static final Pattern PATTERN1 = Pattern.compile("^[0][0-9]{2,3}-?[0-9]{5,10}$");
    /**
     * 验证没有区号的
     */
    private static final Pattern PATTERN2 = Pattern.compile("^[1-9][0-9]{5,8}$");
    private static final Integer NINE = 9;

    /**
     * 手机号验证
     * @param mobile 手机号
     * @return boolean
     */
    public static boolean isMobile(String mobile) {
        Matcher m;
        m = P_MOBILE.matcher(mobile);
        return m.matches();
    }

    /**
     * 固定电话号码验证
     * @param fixedPhone 固定电话
     * @return boolean
     */
    public static boolean phone(String fixedPhone) {
        Matcher m;
        if(NINE < fixedPhone.length()) {
            m = PATTERN1.matcher(fixedPhone);
        } else {
            m = PATTERN2.matcher(fixedPhone);
        }
        return m.matches();
    }

    /**
     * 将以 phone | tel 方式存储的联系方式进行拆分，改动之前可能只存储phone或者tel，改动之后会存储为phone | tel
     * 如果两个联系方式都没填，只有一个|，dh内容为[]，list.size()==1;
     * 如果只有手机号，dh内容为["13812312312"],list.size()=1；
     * 如果只有固话，dh内容为["","01012345678"],list.size()==2;
     * 如果有手机号和固话，dh内容为["13812312312","01012345678"],list.size()==2;
     * @param dianhua 联系方式，格式为：phone | tel 或者 tel | phone 或者 phone 或者 tel 或者 ""
     * @return map 拆分后的手机号码和固定电话，看list.size()判断是否有固定电话
     */
    public static Map<String,String> splitTelAndPhone(String dianhua) {
        Map<String,String> telAndPhone = new HashMap<>(16);
        if(dianhua != null && dianhua.contains(Constants.SpecialChar.NUM_CHAR_E)) {
            //如果是改动之后添加的数据: phone | tel
            String[] dh = dianhua.split("\\|");
            if(dh.length == 1 && isMobile(dh[0])) {
                //拆分之后长度为1，可能是 phone |
                telAndPhone.put("phone",dh[0]);
                //前台将展示空白，而不是null
                telAndPhone.put("tel","");
            } else if(dh.length == 1 && !isMobile(dh[0])) {
                //拆分之后长度为1，可能是 tel |
                telAndPhone.put("tel",dh[0]);
                //前台将展示空白，而不是null
                telAndPhone.put("phone","");
            } else if(Constants.Number.NUM_TWO == dh.length && isMobile(dh[1])) {
                //拆分之后长度为2，存储格式为 固话 |手机号码
                telAndPhone.put("tel",dh[0]);
                telAndPhone.put("phone",dh[1]);
            } else if(Constants.Number.NUM_TWO == dh.length) {
                //拆分之后长度为2，存储格式为 手机号码 | 固话
                telAndPhone.put("phone",dh[0]);
                telAndPhone.put("tel",dh[1]);
            } else {
                //拆分之后为空，可能只有 |
                telAndPhone.put("phone","");
                telAndPhone.put("tel","");
            }
        } else if(dianhua != null && !"".equals(dianhua) && dianhua.length() > 0) {
            //如果是修改之前的数据，且填写了联系方式
            if(isMobile(dianhua)) {
                //如果是手机号码
                telAndPhone.put("phone",dianhua);
                telAndPhone.put("tel","");
            } else if(phone(dianhua)) {
                //如果是固定电话
                telAndPhone.put("phone","");
                telAndPhone.put("tel",dianhua);
            }
        } else {
            //如果dianhua == null || "".equals(dianhua)
            //前台将展示空白，而不是null
            telAndPhone.put("phone","");
            //前台将展示空白，而不是null
            telAndPhone.put("tel","");
        }
        return telAndPhone;
    }
}